package livret.modele;


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

/**
 * L'étudiant est le détenteur du livret
 * Il a un tuteur et peut aussi avoir un maître de stage
 * Il peut faire une retour sur un module sous forme de commentaire
 * Et se tuteurs peuvent faire un retour sur lui-même
 * @author Solohery RAMANANARIVO, Fawzia CHABOUNI, Luc RABARIJAONA
 */
public class Etudiant  {
   private int id_etudiant;
   private int id_session;
   private int id_tuteur;
   private int no_groupe;
   private int id_candidat;
   private String nom;
   private String prenom;
   private String tel1;
   private String tel2;
   private String email;
   private String nom_martial;
   private String date_naissance;
   private String adresse;
   private String id_nationalite;
   private String codePostal;
   private String ville;
   private String id_blog;
   private String url_photo;
   private String id_ldap;
   private String no_etudiant;
   private String password;

   /**
    * Constructeur d'un étudiant, sachant que ces paramètres ne sont pas à introduire par un utilisateur
    * Ils sont recupérés dans la base. 
    * @param id_etudiant
    * @param nom
    * @param prenom
    * @param email
    * @param no_etudiant
    */
   public Etudiant(int id_etudiant, String nom, String prenom, String email, String no_etudiant) {
        this.id_etudiant = id_etudiant;
        this.nom = nom;
        this.prenom = prenom;
        this.email = email;
        this.no_etudiant = no_etudiant;
    }
   
    /**
     * Getter de l'adresse
     * @return l'adresse de l'étudiant
     */
    public String getAdresse() {
        return adresse;
    }

    /**
     * Getter du code postal
     * @return un string du code postal
     */
    public String getCodePostal() {
        return codePostal;
    }

    /**
     * Getter de la date de naissance
     * @return la date de naissance en chaine de caractère
     */
    public String getDate_naissance() {
        return date_naissance;
    }

    /**
     * Getter de l'email
     * @return l'email
     */
    public String getEmail() {
        return email;
    }
    /**
     * Getter de l'URL du blog
     * @return le blog
     */
    public String getId_blog() {
        return id_blog;
    }

    /**
     * Getter de l'id du candidat
     * @return
     */
    public int getId_candidat() {
        return id_candidat;
    }

    public int getId_etudiant() {
        return id_etudiant;
    }

    public String getId_ldap() {
        return id_ldap;
    }

    public String getId_nationalite() {
        return id_nationalite;
    }

    public int getId_session() {
        return id_session;
    }

    public int getId_tuteur() {
        return id_tuteur;
    }

    public String getNo_etudiant() {
        return no_etudiant;
    }

    public int getNo_groupe() {
        return no_groupe;
    }

    public String getNom() {
        return nom;
    }

    public String getNom_martial() {
        return nom_martial;
    }

    public String getPassword() {
        return password;
    }

    public String getPrenom() {
        return prenom;
    }

    public String getTel1() {
        return tel1;
    }

    public String getTel2() {
        return tel2;
    }

    public String getUrl_photo() {
        return url_photo;
    }

    public String getVille() {
        return ville;
    }

    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }

    public void setCodePostal(String codePostal) {
        this.codePostal = codePostal;
    }

    public void setDate_naissance(String date_naissance) {
        this.date_naissance = date_naissance;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setId_blog(String id_blog) {
        this.id_blog = id_blog;
    }

    public void setId_candidat(int id_candidat) {
        this.id_candidat = id_candidat;
    }

    public void setId_etudiant(int id_etudiant) {
        this.id_etudiant = id_etudiant;
    }

    public void setId_ldap(String id_ldap) {
        this.id_ldap = id_ldap;
    }

    public void setId_nationalite(String id_nationalite) {
        this.id_nationalite = id_nationalite;
    }

    public void setId_session(int id_session) {
        this.id_session = id_session;
    }

    public void setId_tuteur(int id_tuteur) {
        this.id_tuteur = id_tuteur;
    }

    public void setNo_etudiant(String no_etudiant) {
        this.no_etudiant = no_etudiant;
    }

    public void setNo_groupe(int no_groupe) {
        this.no_groupe = no_groupe;
    }

    public void setNom(String nom) {
        this.nom = nom;
    }

    public void setNom_martial(String nom_martial) {
        this.nom_martial = nom_martial;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setPrenom(String prenom) {
        this.prenom = prenom;
    }

    public void setTel1(String tel1) {
        this.tel1 = tel1;
    }

    public void setTel2(String tel2) {
        this.tel2 = tel2;
    }

    public void setUrl_photo(String url_photo) {
        this.url_photo = url_photo;
    }

    public void setVille(String ville) {
        this.ville = ville;
    }

    /**
     * Ajoute un commentaire dans la table des commentaires
     * @param date
     * @throws SQLException </br>
     * 
     * <b>Requiert</b></br>
     * contenu != null </br>
     * <b>Assure</b></br>
     * contenu == newContenu</br>
     */

    public void PosterCommentaireCours(String date, String newContenu,int id_destinataire,int id_coursdestinataire) throws SQLException{
        Connection connexion = null;
        Statement select = null;
        ResultSet rs = null;
        try {
            connexion = DataBase.getConnection();
            String sql = "INSERT INTO commentaire (id_auteur,id_destinataire,id_coursdestinataire, date,nomAuteur,prenomAuteur,contenu)"
                    + " VALUES ('"+this.getId_etudiant()+"','"+id_destinataire+"','"+id_coursdestinataire+
                    "','"+date+"','"+this.getNom()+"','"+this.getPrenom()+"','"+newContenu+"');";
            PreparedStatement pstmt = connexion.prepareStatement(sql);
            pstmt.executeUpdate();

        } finally {
          DataBase.close(rs);
          DataBase.close(select);
          DataBase.close(connexion);
        }
    }

 /**
 * Méthode pour récupérer la liste des commentaires
 * @return la liste des messages que le formateur a envoyé
 * @throws SQLException
 */
    public ArrayList<Commentaire> getListeCommentairesCours(int id_cours)throws SQLException {
        ArrayList<Commentaire> commentaires = new ArrayList<Commentaire>();
        Commentaire commentaire = null;
        Connection connexion = null;
        Statement select = null;
        ResultSet rs = null;

        try {
              connexion = DataBase.getConnection();
              select = connexion.createStatement();
              String sql = "SELECT date,id_auteur,id_destinataire,id_coursdestinataire, nomauteur, prenomauteur, contenu "
                      + "FROM commentaire WHERE id_destinataire="+this.getId_etudiant()
                      +" AND id_coursdestinataire="+id_cours+";" ;
              rs = select.executeQuery(sql);
              while (rs.next()) {
                    commentaire = new Commentaire(rs.getString("date"),
                            rs.getString("contenu"), rs.getInt("id_auteur"),
                            rs.getInt("id_destinataire"),rs.getInt("id_coursdestinataire"),
                            rs.getString("nomauteur"),rs.getString("prenomauteur"));
                commentaires.add(commentaire);
              }
        } finally {
              DataBase.close(rs);
              DataBase.close(select);
              DataBase.close(connexion);
        }
            return commentaires;
    }

    /** Récupère un etudiant par son id/password.
   * Si l'étudiant n'est pas trouvé, renvoie null.
   * <br/>Requiert<blockquote> <code>id != null && !login.matches("^(\\s)*$")
   * <br/>password != null</code>
   * </blockquote>
   * @throws SQLException si problème avec le SGBD.
   */
  public static Etudiant getByLoginPassword(final String id,final String password)throws SQLException {
        assert id != null && !id.matches("^\\s*$");
        assert password != null;
        //
        Etudiant etudiant = null;
        Connection cx = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int id_et = Integer.parseInt(id);
        try {
              cx = DataBase.getConnection();
              String sql = "SELECT id_etudiant, nom, prenom, email, no_etudiant "
                      + "FROM etudiant WHERE id_etudiant=? AND password=? ;";
              ps = cx.prepareStatement(sql);
              ps.setInt(1, id_et);
              ps.setString(2, password);
              rs = ps.executeQuery();
              if (rs.next()) {
                etudiant = new Etudiant(rs.getInt("id_etudiant"), rs.getString("nom"), rs.getString("prenom"),
                        rs.getString("email"),rs.getString("no_etudiant"));
              }
        } finally {
          DataBase.close(rs);
          DataBase.close(ps);
          DataBase.close(cx);
        }
        return etudiant;
  }

  public ArrayList<Cours> getListCours() throws SQLException{
        ArrayList<Cours> cours = new ArrayList<Cours>();
        Cours cour = null;
        Connection connexion = null;
        Statement select = null;
        ResultSet rs = null;

        try {
              connexion = DataBase.getConnection();
              select = connexion.createStatement();
              String sql = "SELECT c.id_cours, c.enseignant_id, c.intitule"
                      + " FROM cours c , et_cours e WHERE e.id_etudiant="+ this.getId_etudiant()
                      +" AND c.id_cours = e.id_cours;" ;
              rs = select.executeQuery(sql);
              while (rs.next()) {
                    cour = new Cours(rs.getInt("id_cours"),
                            rs.getInt("enseignant_id"),rs.getString("intitule"));
                cours.add(cour);
              }
        } finally {
              DataBase.close(rs);
              DataBase.close(select);
              DataBase.close(connexion);
        }
            return cours;
  }

  /**
   * Recuperer le nom du tuteur
   */
  public String getNomTuteur()throws SQLException{
      String result ="";
      Connection connexion = null;
      Statement select = null;
      ResultSet rs = null;

      try {
              connexion = DataBase.getConnection();
              select = connexion.createStatement();
              String sql = "SELECT f.nom "
                      + " FROM formateur f, etudiant e WHERE e.id_etudiant="+ this.getId_etudiant()
                      +" AND e.id_tuteur = f.id_formateur;" ;
              rs = select.executeQuery(sql);
              while (rs.next()) {
                    result += rs.getString("nom");
              }
        } finally {
              DataBase.close(rs);
              DataBase.close(select);
              DataBase.close(connexion);
        }

      return result;
  }

  public String getMailTuteur()throws SQLException{
      String result ="";
      Connection connexion = null;
      Statement select = null;
      ResultSet rs = null;

      try {
              connexion = DataBase.getConnection();
              select = connexion.createStatement();
              String sql = "SELECT f.email "
                      + " FROM formateur f, etudiant e WHERE e.id_etudiant="+ this.getId_etudiant()
                      +" AND e.id_tuteur = f.id_formateur;" ;
              rs = select.executeQuery(sql);
              while (rs.next()) {
                    result += rs.getString("email");
              }
        } finally {
              DataBase.close(rs);
              DataBase.close(select);
              DataBase.close(connexion);
        }

      return result;
  }

  public String getNomCours(int id_cours) throws SQLException{
      String result ="";
      Connection connexion = null;
      Statement select = null;
      ResultSet rs = null;

      try {
              connexion = DataBase.getConnection();
              select = connexion.createStatement();
              String sql = "SELECT c.intitule "
                      + " FROM cours c, et_cours e WHERE e.id_etudiant="+ this.getId_etudiant()
                      +" AND c.id_cours = e.id_cours"
                      +" AND c.id_cours = "+id_cours+";" ;
              rs = select.executeQuery(sql);
              while (rs.next()) {
                    result += rs.getString("intitule");
              }
        } finally {
              DataBase.close(rs);
              DataBase.close(select);
              DataBase.close(connexion);
        }

      return result;
  }
}
